
import { CameraPerspectiveEmulator } from "./CameraPerspectiveEmulator";
/**
 * 通过设置透视投影 调整显示窗口的内容

 * !! 存在问题
 * WebGL在默认情况下会按照缓冲区中的顺序绘制图形，而且后绘制的图形覆盖先绘制的图形,因为这样做很高效。
 * 如果场景中的对象不发生运动,观察者的状态也是唯一的,那么这种做法没有问题。但是如果，比如说你希望不断
 * 移动视点，从不同的角度看物体，那么你不可能事先决定对象出现的顺序。

//TODO 后面补一下  通过两次绘制完成左右两边的三角形显示
//TODO 添加mvp矩阵
 */
export class CameraPerspectiveEmulatorResolve extends CameraPerspectiveEmulator{
    
    init(gl: WebGL2RenderingContext | WebGLRenderingContext): void {
        gl.enable(gl.DEPTH_TEST | gl.POLYGON_OFFSET_FILL); //  开启影藏面消除功能 , 启动多边形偏移
        
        super.init(gl);
    }

    protected _initShaderBuffer(gl: WebGL2RenderingContext | WebGLRenderingContext) {
        let vertexBuffer = gl.createBuffer();
        let colorBuffer = gl.createBuffer();
        if (!vertexBuffer || !colorBuffer) return console.error("init buffer fail");

        let vertexColorArr = new Float32Array([
            0.0, 0.9, 4.0, 0.4, 0.4, 0.4,
            0.0, -0.9, 4.0, 0.4, 0.4, 1.0,
            0.8, 0.5, 4.0, 0.4, 0.4, 0.4,

            -0.2, 0.7, 4.0, 0.4, 0.4, 0.4,
            -0.2, -0.7, 4.0, 0.4, 1.0, 0.4,
            0.6, 0.3, 4.0, 0.4, 0.4, 0.4,

            -0.4, 0.5, 0.0, 1.0, 0.4, 0.4,
            -0.4, -0.5, 0.0, 0.4, 0.4, 0.4,
            0.4, 0.1, 0.0, 1.0, 0.4, 0.4,


        ]);

        let size = vertexColorArr.BYTES_PER_ELEMENT;
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
        gl.bufferData(gl.ARRAY_BUFFER, vertexColorArr, gl.STREAM_DRAW);
        gl.vertexAttribPointer(this.a_Position, 3, gl.FLOAT, false, size * 6, 0);
        gl.enableVertexAttribArray(this.a_Position);

        gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
        gl.bufferData(gl.ARRAY_BUFFER, vertexColorArr, gl.STATIC_DRAW);
        gl.vertexAttribPointer(this.a_Color, 3, gl.FLOAT, false, size * 6, size * 3);
        gl.enableVertexAttribArray(this.a_Color);
    }

    draw(gl: WebGL2RenderingContext | WebGLRenderingContext): void {
        gl.clearColor(0.0, 0.0, 0.0, 1.0);
        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); // 清除颜色缓存和深度缓存
        gl.polygonOffset(1.0,1.0);  
        gl.drawArrays(gl.TRIANGLES, 0, 9);
    }

}